//
//  TwowayBindViewController.swift
//  DemoProject
//
//  Created by Hao on 2018/8/14.
//  Copyright © 2018年 hao. All rights reserved.
//

import UIKit

fileprivate struct TUserViewModel {
    
    let username = Variable("guest_t")
    
    lazy var userinfo = {
        return self.username.asObservable()
            .map { $0 == "hao" ? "您是管理员: \($0)" : "您是普通用户: \($0)" }
                .share(replay: 1)
    }()
    
}

/// 将控件的某个属性值与 ViewModel 里的某个 Subject 属性进行双向绑定:
/// 这样当 ViewModel 里的值发生改变时，可以同步反映到控件上
/// 如果对控件值做修改，ViewModel 那边值同时也会发生变化
class TwowayBindViewController: BaseViewController {

    let disposeBag = DisposeBag()
    
    fileprivate var userVM = TUserViewModel()
    
    lazy var textField: UITextField = {
        let textField = UITextField()
        self.view.addSubview(textField)
        textField.borderStyle = .roundedRect
        textField.snp.makeConstraints({ (make) in
            make.center.equalTo(self.view)
            make.width.equalTo(200)
            make.height.equalTo(34)
        })
        return textField
    }()
    
    lazy var label: UILabel = {
        let _label = UILabel()
        self.view.addSubview(_label)
        _label.snp.makeConstraints({ (make) in
            make.centerX.equalTo(self.view)
            make.bottom.equalTo(textField.snp.top).offset(-20)
        })
        return _label
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
//        testBind1()
        customTwowayBindOperator()
    }

}

// MARK: 自定义双向绑定操作符（operator）
extension TwowayBindViewController {
    
    fileprivate func customTwowayBindOperator() {
        // 将用户名与textField做双向绑定
        _ =  self.textField.rx.textInput <-> self.userVM.username
        
        // 将用户信息绑定到label上
        userVM.userinfo.bind(to: label.rx.text).disposed(by: disposeBag)
    }
    
}

///（1）页面上方是一个文本输入框，用于填写用户名。它与 VM 里的 username 属性做双向绑定。
///（2）下方的文本标签会根据用户名显示对应的用户信息。（只有 hangge 显示管理员，其它都是访客）
extension TwowayBindViewController {
    
    fileprivate func testBind1() {
        // 将用户名与textField做双向绑定
        userVM.username.asObservable().bind(to: textField.rx.text).disposed(by: disposeBag)
        textField.rx.text.orEmpty.asObservable().bind(to: userVM.username).disposed(by: disposeBag)
        
        // 用户信息绑定到label上显示
        userVM.userinfo.bind(to: label.rx.text).disposed(by: disposeBag)
    }
    
}

